﻿//////////////////////elaborado por: Susana Taquichiri////////////////////////
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Boa.AIT.AccesoDatos.Contratos;
using Didsoft.DataAccess.NHibernate;
using Didsoft.DataAccess.NHibernate.Extensions;

namespace Boa.AIT.AccesoDatos.Contexto
{
    public class ReporteAccesoDatos : DataAccessBase<object>, IReporteAccesoDatos
    {
        #region RolUsuario
        public List<Entidades.DTO.Reportes.DtoRolUsuario> ListaRolesPorFiltro(string filtro)
        {
            string sql = @"declare @NombrePersona varchar(50)= :filtro
                            select
                            NombreCompleto= p.Nombre+' '+p.ApellidoPaterno+' '+ p.ApellidoMaterno,
                            NombreRol= r.Nombre,
                            NombreUsuario=u.Nombre,
                            p.Genero
                            
                            from DUA_Rol r
                            inner join DUA_Usuario u on r.RolId=u.RolId
                            inner join DUA_Persona p on p.PersonaId=u.PersonaId
                            where p.Nombre like @NombrePersona 
		                            OR p.ApellidoPaterno like @NombrePersona
		                            OR p.ApellidoMaterno like @NombrePersona
                            order by NombreCompleto";

            var query = Session.CreateSQLQuery(sql);
            query.SetAnsiString("filtro", "%" + filtro + "%");
            return query.ListBeanTransformer<Entidades.DTO.Reportes.DtoRolUsuario>().ToList();
        }
        #endregion

        #region EquipoAsignadoEmpleado
        public List<Entidades.DTO.Reportes.DtoEquipoAsignadoEmpleado> ListaEquipoAsignado(string filtro)
        {
            string sql = @"declare @NombrePersona varchar(50)= :filtro
                            select 
                            NombreCompleto = e.Nombre1 + ' ' + e.Apellido1 + ' ' + e.Apellido2,
                            NombreEquipo= ed.Codigo + ' - ' + ed.Nombre,
                            FechaEntrega=Convert(Char(10),ae.FechaEntrega , 103),
                            Estado = aea.EstadoEnum

                            from BOAPERSONAL.Personal.dbo.Empleado e
                            inner join AIT.AIT2.dbo.AIT_AsignaEmpleado ae on ae.EmpleadoId = e.empleadoID
                            inner join AIT.AIT2.dbo.AIT_AsignarEquipoAlmacen aea on aea.AsignarEquipoAlmacenId = ae.AsignarEquipoAlmacenId
                            inner join AIT.AIT2.dbo.AIT_EquipoDisponible ed on ed.EquipoDisponibleId=aea.EquipoDisponibleId
                            where e.Nombre1 like @NombrePersona 
	                                OR e.Apellido1 like @NombrePersona
	                                OR e.Apellido2 like @NombrePersona
                            order by NombreCompleto";

            var query = Session.CreateSQLQuery(sql);
            query.SetAnsiString("filtro", "%" + filtro + "%");
            return query.ListBeanTransformer<Entidades.DTO.Reportes.DtoEquipoAsignadoEmpleado>().ToList();
        }
        #endregion

        #region NotificacionMantenimientos
        public List<Entidades.DTO.Reportes.DtoNotificacionMantenimiento> ListaNotificacionMantenimiento()
        {
            string sql = @"select 
                            NombreCompleto = e.Nombre1 + ' ' + e.Apellido1 + ' ' + e.Apellido2,
                            eit.Codigo, 
                            amp.Accion,
                            FechaProgramada=Convert(Char(10),mp.FechaProgramada , 111),
                            amp.NotificarDiasAntes

                            from AIT.AIT2.dbo.AIT_EquipoIT eit
                            inner join AIT.AIT2.dbo.AIT_EquipoDisponibleItem edi on edi.EquipoId=eit.EquipoId
                            inner join AIT.AIT2.dbo.AIT_MantenimientoPreventivo mp on mp.EquipoDisponibleItemId=edi.EquipoDisponibleItem
                            inner join AIT.AIT2.dbo.AIT_AccionesMantenimiento amp on amp.AccionesMantenimientoId = mp.AccionesMantenimientoId
                            inner join AIT.AIT2.dbo.AIT_AsignaEmpleado ae on ae.AsignaEmpleadoId = mp.AsignaEmpleadoId
                            inner join BOAPERSONAL.Personal.dbo.Empleado e on e.empleadoID = ae.EmpleadoId
                            where mp.FechaProgramada >= getdate() and (DATEDIFF(DAY, getdate(), mp.FechaProgramada)-amp.NotificarDiasAntes)=0
                            order by FechaProgramada";

            var query = Session.CreateSQLQuery(sql);
            return query.ListBeanTransformer<Entidades.DTO.Reportes.DtoNotificacionMantenimiento>().ToList();
        }
        #endregion

        #region SolicitudEquipos
        public List<Entidades.DTO.Reportes.DtoSolicitudEquipo> ListaSolicitudEquipo(string filtro)
        {
            string sql = @"declare @Equipo varchar(50)= :filtro
                            select 
                            FechaSolicitud=Convert(Char(10),se.FechaSolicitud, 111),
                            FechaEntrega=Convert(Char(10),se.FechaEntrega, 111),
                            DiasTardoEntrega=Day(se.FechaEntrega-se.FechaSolicitud),
                            se.SolicitadoPor,
                            se.EntregadoPor,
                            se.Descripcion,
                            TipoConfiguracion=tc.Nombre,
                            TipoEquipo=te.Nombre

                            from AIT.AIT2.dbo.AIT_SolicitudEquipo se
                            inner join AIT.AIT2.dbo.AIT_TipoConfiguracion tc on tc.TipoConfiguracionId=se.TipoConfiguracionId
                            inner join AIT.AIT2.dbo.AIT_TipoEquipo te on te.TipoEquipoId=tc.TipoEquipoId
                            where te.Nombre like @Equipo
                            order by se.FechaSolicitud";

            var query = Session.CreateSQLQuery(sql);
            query.SetAnsiString("filtro", "%" + filtro + "%");
            return query.ListBeanTransformer<Entidades.DTO.Reportes.DtoSolicitudEquipo>().ToList();
        }
        #endregion

        #region ProveedorTaller
        public List<Entidades.DTO.Reportes.DtoProveedorTaller> ListaProveedorTaller(string filtro)
        {
            string sql = @"declare @Proveedor varchar(100)= :filtro
                            select 
                            CodigoEquipo=eit.Codigo, 
                            NombreProveedor=p.Nombre,
                            DireccionProveedor=p.Direccion,
                            TelefonoProveedor=p.Telefono,
                            DireccionTaller=tp.Direccion,
                            TelefonoTaller=tp.Telefono,
                            Region=r.Nombre

                            from AIT.AIT2.dbo.AIT_EquipoIT eit
                            inner join AIT.AIT2.dbo.AIT_Proveedor p on p.ProveedorId = eit.ProveedorId
                            inner join AIT.AIT2.dbo.AIT_TallerProveedor tp on tp.ProveedorId = p.ProveedorId
                            inner join AIT.AIT2.dbo.AIT_Region r on r.RegionId = tp.RegionId
                            where p.Nombre like @Proveedor";

            var query = Session.CreateSQLQuery(sql);
            query.SetAnsiString("filtro", "%" + filtro + "%");
            return query.ListBeanTransformer<Entidades.DTO.Reportes.DtoProveedorTaller>().ToList();
        }
        #endregion

        #region GarantiaEquipos
        public List<Entidades.DTO.Reportes.DtoGarantiaEquipo> ListaGarantiaEquipo(string filtro)
        {
            string sql = @"declare @Equipo varchar(50)= :filtro
                            select 
                            CodigoEquipo=eit.Codigo, 
                            GarantiaFechaInicio=Convert(Char(10),g.FechaInicio, 111),
                            GarantiaFechaFin=Convert(Char(10),g.FechaFin, 111),
                            Proveedor=p.Nombre,
                            DireccionProveedor=p.Direccion,
                            TelefonoPorveedor=p.Telefono,
                            DireccionTaller=r.Nombre+' - '+tp.Direccion,
                            TelefonoTaller=tp.Telefono
                            
                            from AIT.AIT2.dbo.AIT_EquipoIT eit
                            inner join AIT.AIT2.dbo.AIT_Proveedor p on p.ProveedorId = eit.ProveedorId
                            inner join AIT.AIT2.dbo.AIT_TallerProveedor tp on tp.ProveedorId = p.ProveedorId
                            inner join AIT.AIT2.dbo.AIT_Region r on r.RegionId = tp.RegionId
                            inner join AIT.AIT2.dbo.AIT_Garantia g on g.EquipoId=eit.EquipoId
                            where eit.Codigo like @Equipo
                            order by eit.Codigo";

            var query = Session.CreateSQLQuery(sql);
            query.SetAnsiString("filtro", "%" + filtro + "%");
            return query.ListBeanTransformer<Entidades.DTO.Reportes.DtoGarantiaEquipo>().ToList();
        }
        #endregion

        #region MantenimientoEquipoEmpleado
        public List<Entidades.DTO.Reportes.DtoMantenimientoEquipoEmpleado> ListaMantenimientoEquipoEmpleado(string filtro)
        {
            string sql = @"declare @NombrePersona varchar(50)= :filtro
                            select 
                            NombreCompleto = e.Nombre1 + ' ' + e.Apellido1 + ' ' + e.Apellido2,
                            CodigoEquipo=eit.Codigo, 
                            AccionMantenimiento=amp.Accion,
                            mp.RealizadoPor,
                            amp.NotificarDiasAntes,
                            FechaProgramada=Convert(Char(10),mp.FechaProgramada , 111)

                            from AIT.AIT2.dbo.AIT_EquipoIT eit
                            inner join AIT.AIT2.dbo.AIT_EquipoDisponibleItem edi on edi.EquipoId=eit.EquipoId
                            inner join AIT.AIT2.dbo.AIT_MantenimientoPreventivo mp on mp.EquipoDisponibleItemId=edi.EquipoDisponibleItem
                            inner join AIT.AIT2.dbo.AIT_AccionesMantenimiento amp on amp.AccionesMantenimientoId = mp.AccionesMantenimientoId
                            inner join AIT.AIT2.dbo.AIT_AsignaEmpleado ae on ae.AsignaEmpleadoId = mp.AsignaEmpleadoId
                            inner join BOAPERSONAL.Personal.dbo.Empleado e on e.empleadoID = ae.EmpleadoId
                            where e.Nombre1 like @NombrePersona 
	                            OR e.Apellido1 like @NombrePersona
	                            OR e.Apellido2 like @NombrePersona
                            order by FechaProgramada";

            var query = Session.CreateSQLQuery(sql);
            query.SetAnsiString("filtro", "%" + filtro + "%");
            return query.ListBeanTransformer<Entidades.DTO.Reportes.DtoMantenimientoEquipoEmpleado>().ToList();
        }
        #endregion

        #region AccionMantenimientoEquipo
        public List<Entidades.DTO.Reportes.DtoAccionMantenimientoEquipo> ListaAccionMantenimientoEquipo(string filtro)
        {
            string sql = @"declare @Equipo varchar(50)= :filtro
                            select 
                            NombreEquipo=te.Nombre,
                            amp.Accion,
                            amp.FrecuenciaDias,
                            amp.NotificarDiasAntes

                            from AIT.AIT2.dbo.AIT_TipoEquipo te
                            inner join AIT.AIT2.dbo.AIT_AccionesMantenimiento amp on amp.TipoEquipoId = te.TipoEquipoId
                            where te.Nombre like @Equipo";

            var query = Session.CreateSQLQuery(sql);
            query.SetAnsiString("filtro", "%" + filtro + "%");
            return query.ListBeanTransformer<Entidades.DTO.Reportes.DtoAccionMantenimientoEquipo>().ToList();
        }
        #endregion

        #region HistorialMantenimientos
        public List<Entidades.DTO.Reportes.DtoHistorialMantenimiento> ListaHistorialMantenimiento()
        {
            string sql = @"select 
                            NombreCompleto = e.Nombre1 + ' ' + e.Apellido1 + ' ' + e.Apellido2,
                            CodigoEquipo=eit.Codigo, 
                            amp.Accion,
                            FechaProgramada=Convert(Char(10),mp.FechaProgramada , 111),
                            Dias= DATEDIFF(DAY, getdate(), mp.FechaProgramada),
                            mp.RealizadoPor

                            from AIT.AIT2.dbo.AIT_EquipoIT eit
                            inner join AIT.AIT2.dbo.AIT_EquipoDisponibleItem edi on edi.EquipoId=eit.EquipoId
                            inner join AIT.AIT2.dbo.AIT_MantenimientoPreventivo mp on mp.EquipoDisponibleItemId=edi.EquipoDisponibleItem
                            inner join AIT.AIT2.dbo.AIT_AccionesMantenimiento amp on amp.AccionesMantenimientoId = mp.AccionesMantenimientoId
                            inner join AIT.AIT2.dbo.AIT_AsignaEmpleado ae on ae.AsignaEmpleadoId = mp.AsignaEmpleadoId
                            inner join BOAPERSONAL.Personal.dbo.Empleado e on e.empleadoID = ae.EmpleadoId
                            where (DATEDIFF(DAY,month(getdate()), month(mp.FechaProgramada))= 0) 
                                and (DATEDIFF(DAY,year(getdate()), year(mp.FechaProgramada))= 0)
                            order by FechaProgramada";

            var query = Session.CreateSQLQuery(sql);
            return query.ListBeanTransformer<Entidades.DTO.Reportes.DtoHistorialMantenimiento>().ToList();
        }
        #endregion

        #region MantenimientoFechaActual
        public List<Entidades.DTO.Reportes.DtoMantenimientoFechaActual> ListaMantenimientoFechaActual()
        {
            string sql = @"select 
                            FechaProgramada=Convert(Char(10),mp.FechaProgramada , 111),
                            NombreCompleto = e.Nombre1 + ' ' + e.Apellido1 + ' ' + e.Apellido2,
                            CodigoEquipo=eit.Codigo, 
                            amp.Accion,
                            mp.RealizadoPor

                            from AIT.AIT2.dbo.AIT_EquipoIT eit
                            inner join AIT.AIT2.dbo.AIT_EquipoDisponibleItem edi on edi.EquipoId=eit.EquipoId
                            inner join AIT.AIT2.dbo.AIT_MantenimientoPreventivo mp on mp.EquipoDisponibleItemId=edi.EquipoDisponibleItem
                            inner join AIT.AIT2.dbo.AIT_AccionesMantenimiento amp on amp.AccionesMantenimientoId = mp.AccionesMantenimientoId
                            inner join AIT.AIT2.dbo.AIT_AsignaEmpleado ae on ae.AsignaEmpleadoId = mp.AsignaEmpleadoId
                            inner join BOAPERSONAL.Personal.dbo.Empleado e on e.empleadoID = ae.EmpleadoId
                            where DATEDIFF(DAY, getdate(), mp.FechaProgramada) = 0
                            order by FechaProgramada";

            var query = Session.CreateSQLQuery(sql);
            return query.ListBeanTransformer<Entidades.DTO.Reportes.DtoMantenimientoFechaActual>().ToList();
        }
        #endregion

        #region EquiposAlmacen
        public List<Entidades.DTO.Reportes.DtoEquiposAlmacen> ListaEquiposAlmacen(string filtro)
        {
            string sql = @"declare @Almacen varchar(50)= :filtro
                            select 
                            Ciudad=r.Nombre,
                            ae.NombreAlmacen,
                            NombreEquipo=ed.Codigo+' '+ed.Nombre

                            from  AIT.AIT2.dbo.AIT_EquipoDisponible ed
                            inner join  AIT.AIT2.dbo.AIT_AsignarEquipoAlmacen aea on aea.EquipoDisponibleId=ed.EquipoDisponibleId
                            inner join AIT.AIT2.dbo.AIT_AlmacenEmpresa ae on ae.AlmacenEmpresaId=aea.AlmacenEmpresaId
                            inner join AIT.AIT2.dbo.AIT_Region r on r.RegionId=ae.RegionId
                            where r.Nombre like @Almacen
                            order by r.Nombre";

            var query = Session.CreateSQLQuery(sql);
            query.SetAnsiString("filtro", "%" + filtro + "%");
            return query.ListBeanTransformer<Entidades.DTO.Reportes.DtoEquiposAlmacen>().ToList();
        }
        #endregion

        #region ActivoAsignado
        public List<Entidades.DTO.Reportes.DtoActivoAsignado> ListaActivoAsignado(string filtro)
        {
            string sql = @"declare @NombrePersona varchar(50)= :filtro
                            select 
                            NombreCompleto = e.Nombre1 + ' ' + e.Apellido1 + ' ' + e.Apellido2,
                            FechaEntrega=Convert(Char(10),ae.FechaEntrega , 103),
                            NombreEquipo=te.Nombre,
                            CodigoActivo=eit.Codigo

                            from BOAPERSONAL.Personal.dbo.Empleado e
                            inner join AIT.AIT2.dbo.AIT_AsignaEmpleado ae on ae.EmpleadoId = e.empleadoID
                            inner join AIT.AIT2.dbo.AIT_AsignarEquipoAlmacen aea on aea.AsignarEquipoAlmacenId = ae.AsignarEquipoAlmacenId
                            inner join AIT.AIT2.dbo.AIT_EquipoDisponible ed on ed.EquipoDisponibleId=aea.EquipoDisponibleId
                            inner join AIT.AIT2.dbo.AIT_EquipoDisponibleItem edi on edi.EquipoDisponibleId=ed.EquipoDisponibleId
                            inner join AIT.AIT2.dbo.AIT_EquipoIT eit on eit.EquipoId=edi.EquipoId
                            inner join AIT.AIT2.dbo.AIT_ModeloEquipo me on me.ModeloEquipoId=eit.ModeloEquipoId
                            inner join AIT.AIT2.dbo.AIT_TipoEquipo te on te.TipoEquipoId=me.TipoEquipoId
                            where (e.Nombre1 like @NombrePersona 
                            OR e.Apellido1 like @NombrePersona
                            OR e.Apellido2 like @NombrePersona)
                            order by NombreCompleto";

            var query = Session.CreateSQLQuery(sql);
            query.SetAnsiString("filtro", "%" + filtro + "%");
            return query.ListBeanTransformer<Entidades.DTO.Reportes.DtoActivoAsignado>().ToList();
        }
        #endregion
    }
}